package com.example.demo.controller;

import com.example.demo.model.User;
import lombok.extern.slf4j.Slf4j;
import org.apache.catalina.session.StandardSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: fzykd
 * Date: 2022-10-09
 * Time: 20:44
 */

@RestController
@Slf4j
public class UserController {


    // 1.这样直接就从URL地址中输入参数 然后获取到了 返回到页面上
    // 多个参数也是如此 但是前端传来的参数要和后端匹配
    @RequestMapping("/yc")
    public String say(Integer id){
        return "id=" + id;
    }

    @Autowired
    public User user;
    //根据id返回要找到的对象 (如果连接数据库 返回的就是数据库的内容)  但是这个里参数也只有一个
    @RequestMapping("/yi")
    public User hello(Integer id){
        user.setId(10);
        user.setAge(30);
        user.setName("张三");
        return user;
    }

    //2.当参数有很多时 使用类来接受
    //依然可以使用URL传值的方法 传递参数
    //postMan构造的数据是在浏览器中刷新不出来的
    @RequestMapping("/dui")
    public User good(User user){
        System.out.println(user.toString());
        return user;
    }

    //参数重命名
    //在参数中 加了一下注解 @RequestParam 那么前端传来的参数名字 一定要和注解括号里的参数一致 否则报错
    //如果防止报错 那么
    @RequestMapping("/login")
    public String login(@RequestParam(value = "name",required = false) String username ,
                        @RequestParam(value = "pass",required = false) String password){
        return "username = " + username + " password = " + password;
    }


    //3.接受Json格式的数据
    //只有在参数中加了#RequestBody 注解 才能从前端接受Json格式的数据
    //通过PostMan构造的json数据 在页面中时无法展示的 可以通过抓包查看
    @RequestMapping("/json")
    public User add(@RequestBody User user){
        System.out.println(user.toString());
        return user;
    }

    //4.从URL地址栏中获取参数 不是query String中的参数
    @RequestMapping("/url/{id}/{name}")
    public String url(@PathVariable Integer id,@PathVariable String name){
        return "返回信息： " + id + name;
    }


    //5.获取cookie
    //这是获取Cookie的普通方法
    //自己新建的原始页面 没有Cookie 自己来浏览器中创建Cookie
    @RequestMapping("/cookie")
    public void getCookie(HttpServletRequest request){
        Cookie[] cookies = request.getCookies();
        for (Cookie item:cookies) {
            log.info("Cookie Name: " + item.getName()+
                    " | Cookie Value: " + item.getValue());
        }
    }

    //通过注解来获取Cookie  获取指定的Cookie值
    @RequestMapping("/cookie1")
    public String getCoo(@CookieValue("bit") String cookie){
        return "Cookie: " + cookie;
    }

    //6.获取Header请求头里面的信息
    //普通方法
    @RequestMapping("/getua")
    public String sa(HttpServletRequest request){
        return "UA: " + request.getHeader("User-Agent");
    }

    //使用注解的方法 获取header请求的信息
    @RequestMapping("/getu")
    public String sua(@RequestHeader("User-Agent") String us){
        return "headUA: " + us;
    }

    //7.存储和获取Session
    //存储Session就一种方式
    @RequestMapping("/session")
    public boolean setSession(HttpServletRequest request){
        boolean result = false;
        //1.得到HttpSession 创建session的时候 一样要为true
        HttpSession session = request.getSession(true);
        //2.使用setAtt来设置session
        session.setAttribute("userinfo","userinfo");
        result = true;
        return result;
    }

    //获取session的方法
    @RequestMapping("/getsession")
    public String getS(@SessionAttribute( value = "userinfo",required = false) String userinfo){
        return "会话：" + userinfo;

    }


}
